// function foo() {
//   console.log(this.a);
// }
// var obj = {
//   a: 1
// }

// foo.call(obj)//将foo中的this指向obj


function foo(x, y) {
  console.log(this.a, x + y);
}
var obj = {
  a: 1
}
// foo.call(obj, 2, 3) // Function.prototype.call = func，call定义在Function上
//函数体调用call，call的源代码会将该函数体触发。call参数第一个是要绑定的对象，后面参数会传入调用call的函数体中

// foo.apply(obj, [2, 3])//和call传参差不多，只不过加了个[]

// let bar = foo.bind(obj, 2, 3)//接收参数和call差不多，但是bind会返回一个函数体，要接收并且调用才会实现改变this效果
// bar()
// let bar = foo.bind(obj)//如果bind中参数不够的话会去bar中寻找，如果bind中参数够则不会
// bar(2, 3)
// let bar = foo.bind(obj, 1)
// bar(2, 3)